// namespace
var JS;
// singleton
if( !JS ){
	JS = {};
	// unique flag
	JS.hashCode = Math.random();
}
/**
 * 验证 ：各展其能 ，且只有一能 , 不越雷池半步
 */
if( !JS.validate ){
	JS.validate = {};
	JS.validate.hashCode = Math.random();
}
/**
 * 验证规则的规则池
 */
JS.validate.rulePool = {
	hashCode : Math.random(),
	required : function( val , regexRule ){
		/* 调用了JSstring.js的trim()方法 */
		if( val && val.trim().length > 0 ){
			return { result : true };
		}else{
			return { result : false , msg : '不能为空' };
		}
	},
	/* 
	 * 验证数字，默认为验证正负整数 ， 可以通过规则表达式来定义验证项
	 * # 表示0-9的数字
	 * . 表示小数点
	 * #.# 表示一位整数，一位小数
	 * #*2.#*3 表示整数位最多两位，小数位最多三位
	 * #*-1.#*3 表示整数位最多两位，小数位最多三位
	 * number:#*6.#*2 
	 *  */
	number : function( val , regexRule ){
		if( !val ){
			return { result : true };
		}
		// 从规则表达式中取出正则对象
		regexRule = parseRegexRule( regexRule );
		// 如果是表达式不符合规则
		if( !regexRule ){
			return { result : false , msg : '验证字数时的规则表达式出错 ' };
		}else{
			if( regexRule.regex.test( val ) ){
				return { result : true };
			}else{
				return { result : false , msg : regexRule.msg };
			}
		}
		/* 数字的验证规则表达式 , ##.### */
		function parseRegexRule( regexRule ){
			// 默认为验证正负整数
			if( !regexRule ){
				return { regex : /^[+-]?[1-9]\d*$|^0$/ , msg : '请正确输入正负整数' };
			}
			// 检查表达式是否符合规则
			if( !/^[+-]?[#]{1}(\*[-]?\d+)?(\.[#]{1}(\*\d+)?)?$/.test( regexRule ) ){
				alert( '验证字数时的规则表达式出错 : ' + regexRule );
				return null;
			}
			// 是否有负号，默认为没有
			var minus = false;
			// 整数位数
			var intCount = 1;
			// 小数位数
			var decimalsCount = 0;
			regexRule = regexRule.split( '.' );
			if( regexRule[0] ){
				/* 是否有负号 */
				if( /^[-]/.test( regexRule[0] ) ){
					minus = true;
				}else if( /^[+]/.test( regexRule[0] ) ){
					minus = false;
				}
				// 判断整数位数
				regexRule[0] = regexRule[0].substring(1);
				if( regexRule[0].split( '*' )[1] ){
					intCount = regexRule[0].split( '*' )[1];
				}
			}
			// 判断小数位数
			if( regexRule.length > 1 && regexRule[1] ){
				if( regexRule[1].indexOf( '*' ) ==-1 ){
					decimalsCount = 1;
				} else{
					decimalsCount = regexRule[1].split( '*' )[1];
				}
			}
			// 按是否有正负号 、 整数位数 、 小数位数 来生成正则表达式
			var _msg = '请正确输入整数位1-' + intCount + '位，小数位0-' + decimalsCount + '位的';
			if( intCount == -1 ){
				_msg = '请正确输入任意整数位，小数位0-' + decimalsCount + '位的';
			}
			if( minus ){
				_msg += '负浮点数';
			}else{
				_msg += '正浮点数';
			}
			return { regex : createRegex( minus , intCount , decimalsCount ) , msg : _msg };
		}
		// 按条件生成正则表达式
		function createRegex( _minus , _intCount , _decimailsCount ){
			if( _minus ){
				_minus = '^[-]{1}';
			}else{
				_minus = '^[+]?';
			}
			var regex;
			if( _decimailsCount == 0 ){
				if( _intCount == -1 ){
					regex = _minus + '[1-9]\\d*$|'+ _minus +'[0]{1}$';
				}else{
					regex = _minus + '[1-9]\\d{0,'+ ( _intCount - 1 ) +'}$|'+ _minus +'[0]{1}$';
				}
			}else{
				if( _intCount == -1 ){
					regex = _minus + '[1-9]\\d*(\\.\\d{1,'+ _decimailsCount +'})?$|'+ _minus +'[0]{1}(\\.\\d{1,'+ _decimailsCount +'})?$';
				}else{
					regex = _minus + '[1-9]\\d{0,'+ ( _intCount - 1 ) +'}(\\.\\d{1,'+ _decimailsCount +'})?$|'+ _minus +'[0]{1}(\\.\\d{1,'+ _decimailsCount +'})?$';
				}
			}
			return new RegExp( regex ); 
		}
	},
	/*
	 * 验证汉字
	 * regexRule 表示汉字的个数
	 * */
	chinese : function( val , regexRule ){
		if( !val ){
			return { result : true };
		}
		var _regexRule;
		var msg;
		if( regexRule ){
			_regexRule = new RegExp( '^[\u4e00-\u9fa5]{0,'+ regexRule +'}$' );
			msg = '请正确输入0到' + regexRule + '个汉字'
		}else{
			_regexRule = new RegExp( '^[\u4e00-\u9fa5]+$' );
			msg = '请正确输入汉字';
		}
		if( _regexRule.test( val ) ){
			return { result : true };
		}else{
			return { result : false , msg : msg };
		}
	},
	/*
	 * 除了...之外都能存在
	 * */
	except : function( val , regexRule ){
		if( !val ){
			return { result : true };
		}
		var _regexRule;
		var msg;
		if( regexRule ){
			_regexRule = new RegExp( '' )
		}
	},
	/*
	 * 包括...
	 * */
	include : function( val , regexRule ){
		
	},
	/*
	 * 字母数字汉字
	 * */
	alphaNumChinese : function( val , regexRule ){
		if( !val ){
			return { result : true };
		}
		var _regexRule;
		var msg;
		if( regexRule ){
			_regexRule = new RegExp( '^.{0,'+ regexRule +'}$' );
			msg = "请输入0到"+regexRule+"个字符";
		}else{
			_regexRule = new RegExp( '.+' );
			msg = "请输入字符";
		}
		if( _regexRule.test( val ) ){
			return { result : true };
		}else{
			return { result : false , msg : msg };
		}
	},
	/**
	 * 所有字符，只要不是空白字符就可以了
	 */
	anyCharacter : function( val , regexRule ){
		if( !val ){
			return { result : true };
		}
		var _regexRule;
		var msg;
		if( regexRule ){
			_regexRule = new RegExp( '^[0-9A-Za-z\u4e00-\u9fa5]{0,'+ regexRule +'}$' );
			msg = "请输入0到"+regexRule+"个字符";
		}else{
			_regexRule = new RegExp( '^[0-9A-Za-z\u4e00-\u9fa5]+$' );
			msg = "请输入字符";
		}
		if( _regexRule.test( val ) ){
			return { result : true };
		}else{
			return { result : false , msg : msg };
		}
	}
	
}
/**
 * @param val
 *            要验证的值
 * @param regexRule
 *            验证的规则
 * @return true || false 验证之后的结果
 */
JS.validate.proxy = function( val , regexRule ){
	var regex = regexRule.split(':');
	return JS.validate.rulePool[regex[0]]( val , regex[1] );
};